package org.nobject.common.db.member;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.nobject.common.lang.ListUtils;

/**
 * SQL选择器
 * 
 * @author bianrongjun
 * @version 1.0
 */
public class SqlSelect {
	
	/** 构造 */
	public SqlSelect() {
	}

	/** 构造函数 */
	public SqlSelect(List columns) {
		this.columns = columns;
	}

	/** 构造函数 */
	public SqlSelect(String[] columns) {
		this.columns = ListUtils.toList(columns);
	}

	/** 构造函数 */
	public SqlSelect(String[][] sTabCols) {
		for(String[] tabCol:sTabCols){
			columns.add(tabCol[1]);
			colTabs.put(tabCol[1], tabCol[0]);
		}
	}
	
	/** 字段 */
	private List<String> columns =new LinkedList();
	/** 表-字段映射 */
	private Map<String,String> colTabs=new LinkedHashMap();
	/** 别名 */
	private Map<String,String> aliases=new LinkedHashMap();
	
	/* (non-Javadoc)
	 * @see java.lang.Object#clone()
	 */
	public SqlSelect clone(){
		SqlSelect sqlSelect=new SqlSelect();
		sqlSelect.columns=new LinkedList();
		for(String column:columns){
			sqlSelect.columns.add(column);
		}
		
		sqlSelect.colTabs=new LinkedHashMap();
		for(String key:colTabs.keySet()){
			sqlSelect.colTabs.put(key, colTabs.get(key));
		}
		
		sqlSelect.aliases=new LinkedHashMap();
		for(String key:aliases.keySet()){
			sqlSelect.aliases.put(key, aliases.get(key));
		}
		
		return sqlSelect;
	}
	
	/** 
	 * 替换某个字段
	 * @param column 字段
	 * @param newColumn 替换值
	 */
	public void replace(String column,String newColumn){
		for (int i = 0; i < columns.size(); i++) {
			String k=columns.get(i);
			if(k.equals(column)){
				columns.set(i, newColumn);
			}
		}
	}
	
	/** 
	 * 重设字段
	 * @param column 原字段
	 * @param newColumn 新字段
	 * @param alias 别名
	 * @param table 表名
	 */
	public void resetColumn(String column,String newColumn,String alias,String table){
		replace(column, newColumn);
		
		colTabs.put(newColumn, table);
		aliases.put(newColumn, alias);
	}
	
	/** 
	 * 设置别名
	 * @param column 字段
	 * @param alias 别名
	 */
	public void setAlias(String column,String alias){
		aliases.put(column, alias);
	}
	
	/** 
	 * 添加
	 * @param column 字段
	 */
	public SqlSelect add(String column) {
		columns.add(column);
		return this;
	}

	/** 
	 * 添加
	 * @param table 表名
	 * @param column 字段名
	 */
	public SqlSelect add(String table,String column) {
		colTabs.put(table, column);
		columns.add(column);
		return this;
	}
	
	/** 
	 * 获取SQL
	 */
	public String getSql() {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < columns.size(); i++) {
			if (i!=0) sb.append(",");
			
			String column 	=(String) columns.get(i);
			String table	=colTabs.get(column);
			String alias	=aliases.get(column);
			
			if(table!=null){
				sb.append(table).append(".");
			}
			
			sb.append(column);
			
			if(alias!=null){
				sb.append(" AS ").append(alias);
			}
		}
		return sb.toString();
	}
	
	/** 
	 * 获取SQL
	 * @param tabCols
	 */
	public String getSql(Map<String, String> tabCols) {
		this.colTabs.putAll(tabCols);
		return this.getSql();
	}

	/** 
	 * 获取SQL
	 * @param table 表名
	 */
	public String getSql(String table) {
		for(String select:columns){
			this.colTabs.put(select, table);
		}
		return getSql();
	}

	/** 
	 * 是否为空
	 */
	public boolean empty() {
		return (columns == null || columns.size() == 0);
	}
	
	/** 
	 * 是否包含字段
	 * @param column 字段
	 */
	public boolean containsColumn(String column){
		return columns.contains(column);
	}
	
	/** 
	 * 删除字段
	 * @param column 字段
	 */
	public void removeColumn(String column){
		columns.remove(column);
	}
}
